package com.kx.core.aop;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 *  Aop开发流程
 * 1：加入spring-boot-starter-aop依赖，默认就 开启了AOP的支持
 * 2：写一个Aspect ，封装横切关注点（日志，监控等等），
 * 需要配置通知（前置，后置等等）和切入点（哪些包的哪些类的哪些方法）
 * 3：这个Aspect需要拉入spring容器管理
 * 
 * 
 * spring.aop.auto,配置默认启用AOP
 * spring.aop.proxy-target-class(默认false：基于jdk的动态代理，，true：CGlib代理)
 * jdk的动态代理需要接口，没有接口是不会代理的
 * @author     Kangx.li 1703054
 * @version    V1 2018年11月23日
 * @since      Java
 */
@Aspect
@Component
public class UserLogAspect {

    /* execution (* com.kx.core.example..*.*(..))
     *  整个表达式可以分为五个部分：
 1、execution(): 表达式主体。
 2、第一个*号：表示返回类型，*号表示所有的类型。
 3、包名：表示需要拦截的包名，后面的两个句点表示当前包和当前包的所有子包，com.sample.service.impl包、子孙包下所有类的方法。
 4、第二个*号：表示类名，*号表示所有的类。
 5、*(..):最后这个星号表示方法名，*号表示所有的方法，后面括弧里面表示方法的参数，两个句点表示任何参数。
     */
    @Before("execution(* com.kx.core.example..*.*(..))")
    public void log() {
	System.out.println("before===== out log done:");
    }

    @After("execution(* com.kx.core.example..*.*(..))")
    public void logAfter(JoinPoint point) {
	point.getSignature().getName();// 方法名称
	System.out.println("after===== out log done:");
	System.out.println(point.getTarget().getClass());
	System.out.println(point.getSignature().getName());
	System.out.println(Arrays.asList(point.getArgs()));
    }
}

